简介 :
ReactiveCocoa(简称:RAC)为一个开源函数响应式编程框架;
使用场景:通过RAC可以更加方便编程进行MVVM设计模式编程;
核心机制为信号(信号流)。
由于Swift和OC版本存在的差异性比较大,维护团队直接给拆了一下: Swift版本(ReactiveSwift)和 OC版本(ReactiveCocoa)
写该篇文章的初衷: 如何使用RAC 和 如何借助RAC来逐步实现MVC到MVVM的迁移。
一、ReactiveCocoa初见
1、编程思想
ReactiveCocoa是函数式编程(Functional Programming)和响应式编程(Reactive Programming)集大成者;
*2、实现关键: *
2.1. 每个方法必须有返回值(本身对象)
2.2. 把函数或者Block当做参数, block参数(需要操作的值)block返回值(操作结果);
3、ReactiveCocoa初见
0、如何集成就略了(直接拉入项目或者CocoaPods)
1、 RACSiganl
最基本的信号类,默认为冷信号,表示当数据改变时,信号内部会发出数据,只有订阅了(subscribeNext)才会进被触发(编程热信号),代码演示如下:
1 | // 1.创建信号 |
*2、RACSubscriber *
订阅者,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。(示例也如上所示)
*3、RACDisposable : *
用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
使用场景:不想监听某个信号时,可以通过它主动取消订阅信号
代码演示如下:
1 | // 1.创建 |
4、RACSubject
4.1. RACSubject:信号提供者,自己可以充当信号,又能发送信号。
4.2. 用场景:通常用来代替代理,有了它,就不必要定义代理了。
5、RACTuple
元组类,类似NSArray,用来包装值.
1 | RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:@[@"hello111", @"hello222",@"hello333"]]; |
6、RACSequence
6.1、RAC中的集合类,用于代替NSArray,NSDictionary,可以使用它来快速遍历数组和字典。
1 | 1、RACSequence代替数组 |
7、RACCommand
7.1、直译为命令,只是一个继承自 NSObject 的类,但是它却可以用来创建和订阅用于响应某些事件的信号。
7.2、相对而言比较复杂
7.3、使用场景:网络请求(MVVM设计模式中网络模块)
7.4、在默认情况下 RACCommand 都是不支持并发操作的,需要在上一次命令执行之后才可以发送下一次操作,如果直接execute:两次,最终也只会执行第一个execute:; 所以谨记 在使用应用中推荐一个网络请求对应一个command;
1 | 简单使用 - 用于网络请求 |
8、RACMulticastConnection
8.1、直译为多播连接;
8.2、存在的问题普通的信号在执行sendNext:的时候,都会重新再执行以下信号的创建,当你想在一个请求完成后 进行分多级刷新UI 或者 做一些别的操作,如果直接用普通的信号进行sendNext:时候,则会进行多次网络请求操作;
8.3、项目中使用到的场景比较少;
1 |
|
二、ReactiveCocoa使用场景
1、代替代理
1、对象持有signal, 推荐用这种
1 | Code eg.: |
2、使用rac_signalForSelector来进行方方法的执行,类似于系统自带方法performSelector:withObject:,不推荐(硬编码 和 警告);
1 | Code eg.: |
2、代替KVO:
1 | - (void)insteadKVO |
3、监听按钮的点击事件:
1 | - (void)monitorBtnClick |
4、代替通知:
1 | - (void)insteadNotification |
5、监听文本框文案:
1 | - (void)insteadTextInput |
6、处理当界面有多次请求时,需要都获取到数据时,才能展示界面
1 |
|
三、浅谈MVVM
简介:MVVM,个人理解他就是MVC的升级版,解耦版,它是一种双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然; MVVM设计模式并不一定要借助RAC来实现,但若使用RAC来实现会更加的简单(因为所有的操作和响应都通过信号来完成对接);
M : 最基本的模型数据
V : 视图 / 控制器
VM : 处理业务的逻辑(eg:操作事件、数据请求等)
1.项目目录结构的体现(给你一种既视感😆):
Module
├── Controllers
├── Views
├── Models
└── VM
2.具体的实操(由于比较简单的实现,model数据就放在VM里面)
2.1. V(控制器或者视图)里面的写法: 提前对数据进行绑定
1 | 备注: LoginVc.m 文件, LoginVc.h文件可忽略 |
2.2. VM (数据的交互),由于比较简单直接把model放到了VM里面了, 一些数据的逻辑处理, 按钮是否可点击,网络是否要请求等;
1 | 头文件:LogingVM.h |
3、 通过上面的登陆示例,可以感受到RAC在MVVM的便捷性,可测试性(VM)都有一定的提高。
4、如果项目把设计模式由MVC迁移为MVVM,可以分步走,可以理解MVVM是升级版的MVC, 其实就是把以前放在VC 里面处理的逻辑有条理的放到VM里面,Code可测性变高。